Flutter 混合路由
对于现存的大量移动端 App 来说,由于成本太高,通常无法全部用 Flutter 重写。更常采用的方法是,采用混合开发,保留原生业务不变,对新业务增量使用 Flutter。
这涉及到同时维护原生、Flutter 两套技术栈,我们称之为混合开发。
在混合技术栈中,原生页面与 Flutter 页面间相互跳转、相互传参是一个技术难点,被称为混合路由。
在本文中,梳理了现有 Flutter 混合路由方案,并介绍其核心实现原理。
方案梳理
大厂方案
方案 | 官方多引擎 | flutter_boost | TRouter | flutter_thrio |
---|---|---|---|---|
出品方 | Gogole | 阿里咸鱼 | 腾讯心悦 | 哈啰单车 |
核心原理 | 官方容器 + EngineGroup多引擎 | 路由收归原生 一个容器对应一个Flutter页面 |
连续 Flutter 跳页用一个 Activity/VC 合并 | |
单引擎/多引擎 | 多引擎 | 单引擎 | 单引擎 | |
缺点 | 引擎间不互通,状态难以同步 | 技术栈锁定:强制绑定路由、组件开发范式,迁移成本高 维护成本高:遇到问题只能修改源码,难度大 复杂度高:技术挑战大 Flutter SDK 侵入:3.0 版本中已简化 |
Android 通过字节码 Hook 侵入 Flutter SDK,避免直接修改引擎,仍有维护成本 | |
引擎升级维护成本 | 无 | 高(3.0 低) | 中 | 高? |
Android容器类型 | ||||
iOS容器类型 | ||||
View级别容器 | 支持 | 不支持 | 不支持 | 不支持 |
资料地址 | Flutter混合栈路由实践与优化 | HeapDump性能社区 |
未开源方案:字节跳动 Isolate 复用,
GitHub 开源方案
方案 | wangkunhui/min_stack_manager | ||
---|---|---|---|
stars | 26 | ||
核心原理 | Ativity 生命周期与 Navigator 同步 | ||
单引擎/多引擎 | 单引擎 | ||
缺点 | 复杂路由场景有待完善 | ||
Android 容器类型 | 基于 FlutterView 自封 Activity | ||
iOS 容器类型 | |||
资料地址 |
单引擎混合路由方案
官方多引擎方案,由于引擎间的通信隔离,不适合承载大规模 Flutter 逻辑。因此没有被众多厂家采用。大多数厂家仍延续 flutter_boost
的思路,在单引擎上实现混合路由。具体怎么实现呢?
混合路由包含两个核心部分:原生侧的页面容器、Flutter 侧 Navigator 页面栈。
概括来说:每个容器都映射到 Navigator 页面栈中的一部分,需要在两者间,通过 Channel、RouteObserver 建立生命周期的同步关系。
这其中,涉及到一系列难点:
- 内存异常:容器创建、销毁涉及到大量内存操作,普遍存在内存异常问题。原因是三方方案对官方容器实现进行修改,修改过程中引入内存释放问题
- Flutter SDK 侵入:三方方案通常需要修改 Flutter SDK 中官方实现,过程中踩坑,难度和维护成本增大
- 渲染异常:在多引擎调度时,涉及到多个 Surface 切换,存在黑屏、白屏、屏闪问题
- 崩溃:Flutter 引擎内部的生命周期较为复杂,在对 Flutter SDK 进行修改时,若打破了生命周期的有序性,将导致崩溃
- 卡顿:Flutter 是一个高性能渲染框架,在对 Flutter SDK 进行修改时,如果影响到高效的渲染流水线,会导致卡顿
因此,实现一套基于单引擎混合路由方案是不容易的,具有一定的难度和复杂度。
网络资源
- 一款零侵入的高效Flutter混合栈管理方案,你值得拥有! - 掘金
- Flutter混合栈路由实践与优化 | HeapDump性能社区
- Flutter混合栈管理_android flutter 混合栈-CSDN博客:对混合路由问题进行了比较完整的介绍
- Flutter 混合架构方案探索 - 掘金:提到了以 PlatformView 作为混合路由的方案
- PlatformView 允许我们向 Flutter 界面中插入原生 View,在一个页面的最外层包裹一层 PlatformView,路由的管理都由 Flutter 来处理。这种方式下没有额外的 Engine 产生,是最简单的混合方式。
- 但它也有缺点,不适合主 Native 混 Flutter 的场景,而现在大多都是以主 Native 混 Flutter的场景为主。
- 另外,PlatformView 因其底层实现,会出现兼容性问题,在一些机型下可能会出现键盘问题、闪烁或其它的性能开销,具体可看这篇介绍
- 多个 Flutter 页面 混合路由栈 FlutterEngineGroup - 白乾涛 - 博客园
本文作者:Maeiee
本文链接:Flutter 混合路由
版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!
喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!